Было интересно ознакомиться с вариантом создания сайта на WordPress используя связку Nginx + Apache.
Очень понравился сервис Яндекс.Облако. Пользоваться удобно. Техническая документация замечательная. Сайт www.estelefe.ru размещен в «облаке».
Итог ознакомления: www.estelefe.ru и заметка о создании сайта, которая, быть может, кому-то будет в помощь.
Обновляем программное обеспечение:
sudo apt update && sudo apt upgrade
Устанавливаем PHP (с дополнительными модулями), СУБД MySQL, веб-сервер Apache 2, архиватор unzip:
sudo apt install php php-mysql php-cli php-curl php-fpm php-gd php-dom php-mbstring php-imagick php-zip sudo apt install mysql-server mysql-client sudo apt install apache2 sudo apt install unzip
Переходим к работе в интерфейс командной строки СУБД MySQL:
sudo mysql
Создаем базу данных «wp_site»:
CREATE DATABASE wp_site;
Создаем пользователя СУБД «admin_site» c паролем «qwerty»:
CREATE USER 'admin_site'@'localhost' IDENTIFIED BY 'qwerty';
Предоставляем все права пользователю «admin_wp_site» на базу данных «wp_site»:
GRANT ALL PRIVILEGES ON wp_site.* TO 'admin_site'@'localhost';
Выходим из интерфейса командной строки СУБД MySQL:
\q
Останавливаем работу веб-сервера Apache 2:
sudo systemctl stop apache2.service
Открываем в текстовом редакторе «nano» файл настройки прослушиваемых портов веб-сервера Apache 2:
sudo nano /etc/apache2/ports.conf
Изменяем строку Listen 80 на Listen 8080
После сохранения файла веб-сервер Apache 2 будет ожидать обращения на порту 8080.
Файл настройки прослушиваемых портов веб-сервера Apache 2 имеет вид:
Listen 8080
<IfModule ssl_module>
Listen 443
</IfModule>
<IfModule mod_gnutls.c>
Listen 443
</IfModule>
Завершаем работу в текстовом редакторе «nano» (Ctrl+X); сохраняем изменения в файле (Y).
Копируем стандартный файл настройки сайта:
sudo cp /etc/apache2/sites-available/000-default.conf /etc/apache2/sites-available/BACKUP_000-default.conf
Открываем в текстовом редакторе «nano» стандартный файл настройки сайта веб-сервера Apache 2:
sudo nano /etc/apache2/sites-available/000-default.conf
Изменяем строку VirtualHost *:80 на VirtualHost 127.0.0.1:8080
После сохранения файла сайт будет доступен по ip-адресу 127.0.0.1 на порту 8080 веб-сервера Apache 2.
Добавляем строку: SetEnvIf X-Forwarded-Proto https HTTPS=on
Файл настройки сайта веб-сервера Apache 2 имеет вид:
<VirtualHost 127.0.0.1:8080>
ServerAdmin webmaster@localhost
DocumentRoot /var/www/html
ErrorLog ${APACHE_LOG_DIR}/error.log
CustomLog ${APACHE_LOG_DIR}/access.log combined
SetEnvIf X-Forwarded-Proto https HTTPS=on
</VirtualHost>
Завершаем работу в текстовом редакторе «nano» (Ctrl+X); сохраняем изменения в файле (Y).
Открываем в текстовом редакторе «nano» файл настройки веб-сервера Apache 2:
sudo nano /etc/apache2/apache2.conf
В конец файла добавляем строку Protocols h2 h2c http/1.1
После сохранения файла веб-сервер Apache 2 будет поддерживать работу по протоколам http2, http/1.1.
Завершаем работу в текстовом редакторе «nano» (Ctrl+X); сохраняем изменения в файле (Y).
Открываем в текстовом редакторе «nano» файл настройки модуля PHP (включение CGI):
sudo nano /etc/php/7.4/fpm/php.ini
Ищем в тексте файла строку:
;cgi.fix_pathinfo=1
Для поиска и перехода в текстовом редакторе «nano» можно воспользоваться комбинацией клавиш (Ctrl+Q) и ввести искомую строку.
Заменяем на строку:
cgi.fix_pathinfo=1
Завершаем работу в текстовом редакторе «nano» (Ctrl+X); сохраняем изменения в файле (Y).
Перезапускаем работу модуля php7.4-fpm:
sudo systemctl restart php7.4-fpm
Устанавливаем модуль RPAF для веб-сервера Apache 2:
sudo apt install libapache2-mod-rpaf
Открываем в текстовом редакторе «nano» файл настройки модуля RPAF:
sudo nano /etc/apache2/mods-available/rpaf.conf
Добавляем строки:
RPAFproxy_ips 127.0.0.1:8080
RPAFheader X-Real-IP
RPAFheader X-Forwarded-For
Файл настройки модуля RPAF имеет вид:
<IfModule rpaf_module>
RPAFenable On
RPAFsethostname On
RPAFproxy_ips 127.0.0.1 ::1
RPAFproxy_ips 127.0.0.1:8080
RPAFheader X-Real-IP
RPAFheader X-Forwarded-For
</IfModule>
Завершаем работу в текстовом редакторе «nano» (Ctrl+X); сохраняем изменения в файле (Y).
Включаем модуль RPAF:
sudo a2enmod rpaf
Настройка модулей php7.4, mpm_prefork, mpm_event, proxy_fcgi, setenvif, http2 веб-сервера Apache 2.
Отключаем модули: php7.4 и mpm_prefork:
sudo a2dismod php7.4 mpm_prefork
Включаем модули: mpm_event, proxy_fcgi, setenvif, http2:
sudo a2enmod mpm_event proxy_fcgi setenvif http2
Применяем настройку модуля php7.4-fpm:
sudo a2enconf php7.4-fpm
Возобновляем работу веб-сервера Apache 2:
sudo systemctl start apache2.service
Устанавливаем веб-сервер Nginx:
sudo apt install nginx
Копируем стандартный файл настройки сайта веб-сервера Nginx:
sudo cp /etc/nginx/sites-available/default /etc/nginx/sites-available/BACKUP_default
Редактируем файл настройки сайта веб-сервера Nginx в текстовом редакторе «nano»:
sudo nano /etc/nginx/sites-available/default
Ищем в тексте файла строку:
index index.html index.htm index.nginx-debian.html;
Добавляем под нее следующие строки:
location ~ /\. {
deny all;
}
Ищем в тексте файла строку:
server_name _;
Заменяем её на строку:
server_name site.local www.site.local;
Ищем в тексте файла строку:
location / {
Добавляем под нее следующие строки:
#Перенаправление обращений к веб-серверу Apache 2
proxy_connect_timeout 1;
proxy_set_header Host $http_host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Host $http_host;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_pass http://127.0.0.1:8080;
Файл настройки сайта веб-сервера Nginx имеет вид:
server {
listen 80 default_server;
listen [::]:80 default_server;
root /var/www/html;
index index.html index.htm index.nginx-debian.html;
location ~ /\. {
deny all;
}
server_name site.local www.site.local;
location / {
try_files $uri $uri/ =404;
#Перенаправление обращений к веб-серверу Apache 2
proxy_connect_timeout 1;
proxy_set_header Host $http_host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Host $http_host;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_pass http://127.0.0.1:8080;
}
}
Завершаем работу в текстовом редакторе «nano» (Ctrl+X); сохраняем изменения в файле (Y).
Удаляем файл index.html:
sudo rm /var/www/html/index.html
Скачиваем архив с файлами CMS WordPress (версия 5.4.2-ru_RU):
sudo wget https://ru.wordpress.org/wordpress-5.4.2-ru_RU.zip
Распаковываем архив с файлами CMS WordPress
sudo unzip wordpress-5.4.2-ru_RU.zip
Копируем файлы CMS WordPress в директорию для сайта:
sudo cp -r wordpress/* /var/www/html
Открываем в текстовом редакторе «nano» файл настройки CMS WordPress:
sudo nano /var/www/html/wp-config-sample.php
В строках содержащих DB_NAME, DB_USER, DB_PASSWORD указываем значения, которые задали при создании пользователя и базы данных в СУБД MySQL:
/** Имя базы данных для WordPress */
define( 'DB_NAME', 'wp_site' );
/** Имя пользователя MySQL */
define( 'DB_USER', 'admin_site' );
/** Пароль к базе данных MySQL */
define( 'DB_PASSWORD', 'qwerty' );
Завершаем работу в текстовом редакторе «nano» (Ctrl+X); сохраняем изменения в файле (Y).
Копируем файл настройки CMS WordPress:
sudo cp /var/www/html/wp-config-sample.php /var/www/html/wp-config.php
Удаляем пример файла настройки:
sudo rm /var/www/html/wp-config-sample.php
Назначаем владельцем директорий и файлов сайта пользователя «www-data» (системную учетную запись веб-сервера):
sudo find /var/www/html/ -type d -exec chown www-data {} \;
sudo find /var/www/html/ -type f -exec chown www-data {} \;
Возобновляем работу веб-сервера Nginx
sudo systemctl start nginx
Открываем в веб-браузере URL, где в место ip-адреса 192.168.1.111 укажите ip-адрес вашего сервера:
http://192.168.1.111/index.php
Создаем учетную запись администратора сайта.
Осуществляем вход под созданной учетной записью.
Готово. Сайт работает.
После регистрации доменного имени имеет смысл установка сертификата для сайта.
Если будете регистрировать доменное имя для вашего сайта на reg.ru, вероятно, будет предоставлен SSL-сертификат начального уровня доверия.
О том, как настроить SSL-сертификат на Nginx можно узнать из соответствующей статьи на сайте регистратора:
После регистрации доменного имени и получения сертификата, можете воспользоваться конфигурацией для Nginx представленной ниже.
Создаем директорию для файлов сертификата:
sudo mkdir /SSL
После размещения в данной директории файлов сертификата создаем dhparam.pem файл:
sudo openssl dhparam -out /SSL/dhparam.pem 4096
Вариант файла настройки сайта для Nginx следующий:
#HTTP/1.1. Ожидание подключений на порту 80
server {
charset utf-8;
server_name site.ru www.site.ru;
listen *:80;
#Перенаправление на 443 порт (HTTPS) c возвратом кода состояния 301
return 301 https://$server_name$request_uri;
}
#HTTP/2. SSL. Ожидание подключений на порту 443
server {
charset utf-8;
server_name site.local www.site.local;
listen *:443 ssl http2;
#путь к файлу сертификата
ssl_certificate /SSL/site.ru.crt;
#путь к файлу ключа сертификата
ssl_certificate_key /SSL/site.ru.key;
#путь к файлу dhparam.pem
ssl_dhparam /SSL/dhparam.pem;
#срок истечения сессии
ssl_session_timeout 1h;
#размер памяти, выделяемой для хранения кеша
ssl_session_cache shared:SSL:15m;
#разрешения только для TLS
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_ciphers kEECDH+AES128:kEECDH:kEDH:-3DES:kRSA+AES128:kEDH+3DES:DES-CBC3-SHA:!RC4:!aNULL:!eNULL:!MD5:!EXPORT:!LOW:!SEED:!CAMELLIA:!IDEA:!PSK:!SRP:!SSLv2;
#установка строго соблюдения заданных ограничений
ssl_prefer_server_ciphers on;
#указывает браузерам помнить данные требования безопасности для домена один год
add_header Strict-Transport-Security "max-age=31536000";
#Продолжительность соединения
keepalive_timeout 1;
reset_timedout_connection on;
#Путь к корневой директории файлов сайта
root /var/www/html;
#Приоритет чтения файлов сайта
index index.php index.html;
#Запрет получения скрытых файлов (например к .htaccess и .htpassword)
location ~ /\. {
deny all;
}
#Перенаправление обращений к веб-серверу Apache 2
location / {
proxy_connect_timeout 1;
proxy_set_header Host $http_host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Host $http_host;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_pass http://127.0.0.1:8080;
}
}
Альтернативный вариант установки сертификата для сайта — Certbot —
бесплатный программный инструмент с открытым исходным кодом для
автоматического использования сертификатов Let’s Encrypt.
Инструкция: https://certbot.eff.org/lets-encrypt/ubuntufocal-nginx
Проверка подключения репозитария:
sudo apt-get install software-properties-common
sudo add-apt-repository universe
Установка Certbot для Nginx:
sudo apt-get install certbot python3-certbot-nginx
Получение, установка и обслуживание сертификата в автоматическом режиме:
sudo certbot --nginx
Всего Вам хорошего.
Публикации на тему:
https://github.com/ksemaev
https://community.vscale.io/hc/ru/community/posts/208808369-Настройка-Nginx-в-качестве-обратного-прокси-к-Apache
https://community.vscale.io/hc/ru/community/posts/208340569-Как-установить-и-настроить-LEMP-Linux-Nginx-MySQL-PHP-на-сервере-с-Ubuntu-16-04
https://www.digitalocean.com/community/questions/nginx-as-reverse-proxy-for-apache-too-many-redirects
https://habr.com/ru/post/351402/
Ссылки на ресурсы:
Техническая документация Яндекс.Облако — https://cloud.yandex.ru/docs
Яндекс.Облако — https://cloud.yandex.ru/
Яндекс.Вебмастер — https://webmaster.yandex.ru/
REG.RU — https://www.reg.ru/
Nginx — https://www.nginx.com/
Apache — https://www.apache.org/
WordPress — https://ru.wordpress.org/
PHP — https://www.php.net/
MySQL — https://www.mysql.com/
Ubuntu Server — https://ubuntu.com/download/server
Certbot — https://certbot.eff.org/
Let’s Encrypt — https://letsencrypt.org/